package com.iwhalecloud.bss.kite.cucc.service.pos.bcmc.handler.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

import org.codehaus.plexus.util.StringUtils;

import com.iwhalecloud.bss.kite.common.chain.IHandler;
import com.iwhalecloud.bss.kite.common.util.KiteListUtils;
import com.iwhalecloud.bss.kite.common.util.KiteStringUtils;
import com.iwhalecloud.bss.kite.cucc.client.dto.cust.CuccContextCustDTO;
import com.iwhalecloud.bss.kite.cucc.client.dto.pos.KitePosAttrDTO;
import com.iwhalecloud.bss.kite.cucc.client.dto.pos.KitePosBaseDTO;
import com.iwhalecloud.bss.kite.cucc.common.constant.LocalKeyConsts;
import com.iwhalecloud.bss.kite.cucc.common.constant.LocalPosConsts;
import com.iwhalecloud.bss.kite.cucc.service.pos.bcmc.BcmcPosContext;
import com.iwhalecloud.bss.kite.cucc.service.pos.handler.CuccPosServiceUtils;
import com.iwhalecloud.bss.kite.cucc.service.util.ChangeTypeUtils;
import com.iwhalecloud.bss.kite.manager.enums.ActionType;
import com.iwhalecloud.bss.kite.manager.inst.KiteAttr;
import com.iwhalecloud.bss.kite.service.ord.pos.vo.KitePosInstVO;

/**
 * <Description> <br>
 * BCMC下单报文封装抽象类
 *
 * @author XXX<br>
 * @version 1.0<br>
 * @taskId <br>
 * @CreateDate 2020年12月15日 <br>
 * @since R9.0<br>
 * @see com.iwhalecloud.bss.kite.cucc.service.pos.bcmc.handler.impl <br>
 */
public abstract class AbstractBcmcPosHandler implements IHandler<BcmcPosContext> {

    /**
     * Description: <br>
     * 根据属性名称获取属性值
     *
     * @author XXX<br>
     * @taskId <br>
     * @param developerAttrs
     * @param fieldName
     * @param errorMsg
     * @return <br>
     */
    protected String getAttrValue(List<KiteAttr> developerAttrs, String fieldName, String errorMsg) {
        List<KiteAttr> attrs = developerAttrs.stream().filter((attr) -> fieldName.equals(attr.getFieldName()))
            .collect(Collectors.toList());
        if (KiteListUtils.isEmpty(attrs)) {
            // ErrorConsts.BUSI_COMMON_ERROR.throwOut(errorMsg);
            return "";
        }
        KiteAttr attr = attrs.get(0);
        if ("F".equals(attr.getIsNull()) && KiteStringUtils.isEmpty(attr.getValue())) {
            // ErrorConsts.BUSI_COMMON_ERROR.throwOut("属性值不能为空：" + attr.getCname());
        }

        return attr.getValue() != null ? attr.getValue() : "";
    }

    /**
     * 政企订单中心收单后，instanceId会重新生成，这里设置为属性传给订单中心，查订单详情时会返回<br>
     * 作为实例属性节点，记录极简受理中实例ID
     */
    protected void addInstanceIdAttr(BcmcPosContext context, String instIdValue, KitePosBaseDTO dto,
        String changeType) {
        List<KitePosAttrDTO> attrs = dto.getAttrs();
        if (KiteListUtils.isEmpty(attrs)) {
            attrs = new ArrayList<>();
            dto.setAttrs(attrs);
        }
        if (attrs.stream().anyMatch((attr) -> attr.getCode().equals(LocalPosConsts.ATTR_KEY_INSTANCE_ID))) {
            return;
        }

        KitePosAttrDTO attr = new KitePosAttrDTO();
        attr.setType(LocalPosConsts.ATTR_TYPE_STRING);
        attr.setCode(LocalPosConsts.ATTR_KEY_INSTANCE_ID);
        attr.setValue(instIdValue);
        attr.setStartDate(CuccPosServiceUtils.getSceneCreateDate(context));
        attr.setEndDate(LocalKeyConsts.ATTR_SEND_DATE);
        attr.setCname("实例ID");
        attr.setChangeType(changeType);
        attrs.add(attr);
    }

    /**
     * Description: <br>
     * 添加客户类型属性节点
     */
    protected void addCustTypeAttr(BcmcPosContext context, KitePosBaseDTO dto, String changeType) {
        CuccContextCustDTO custDto = context.getCustDto();
        List<KitePosAttrDTO> attrs = dto.getAttrs();
        if (KiteListUtils.isEmpty(attrs)) {
            attrs = new ArrayList<>();
            dto.setAttrs(attrs);
        }

        if (attrs.stream().anyMatch((attr) -> attr.getCode().equals(LocalPosConsts.ATTR_KEY_CUST_TYPE))) {
            return;
        }

        KitePosAttrDTO attr = new KitePosAttrDTO();
        attr.setCode(LocalPosConsts.ATTR_KEY_CUST_TYPE);
        attr.setType(LocalPosConsts.ATTR_TYPE_STRING);
        attr.setStartDate(CuccPosServiceUtils.getSceneCreateDate(context));
        attr.setEndDate(LocalKeyConsts.ATTR_SEND_DATE);
        attr.setValue(Optional.ofNullable(custDto.getCustClassType()).orElse(""));
        attr.setCname("客户类型");
        attr.setChangeType(changeType);
        attrs.add(attr);
    }

    /**
     * 根据实例动作获取变更类型<br>
     * 实例动作新增则返回新增操作，其他默认为不变<br>
     * 提供给特定属性节点使用（cust_type 、 instance_id 等）
     */
    protected String getChangeTypeByInst(KitePosInstVO instVo) {
        String changeType = ChangeTypeUtils.getChangeType(ActionType.K.name());
        if (StringUtils.equals(instVo.getActionType(), ActionType.A.name())) {
            changeType = ChangeTypeUtils.getChangeType(ActionType.A.name());
        }
        return changeType;
    }

}
